/**函数f的概念就是对于输入x产生一个输出y=f(x)

纯函数是指没有任何副作用的函数，除了根据输入值计算输出值之外，什么也不做。而不纯函数则可能导致副作用。

副作用包括：

使全局状态改变：这里的“全局”是指函数作用域之外。
改变其输入参数
抛出异常
执行任何 I/O 操作
纯函数拥有许多的好处：

并行化：由于输出值仅依赖于输入值，所以可以并行执行任务。
惰性求值
记忆化：缓存函数结果，以便只计算一次。

形参传递引用类型的值也会导致副作用
*/

/**
 * 实现函数缓存
 * 通过闭包和高阶函数进行封装
 * 高阶函数： JavaScript的函数其实都指向某个变量。既然变量可以指向函数
 * ，函数的参数能接收变量，那么一个函数就可以接收另一个函数作为参数，这种函数就称之为高阶函数。说白了就是一个返回函数的函数
 */

function memorize(fn) {
    let cache = {};
    return function (...args) {
        let key = JSON.stringify(args);
        // console.log(key);
        // console.log(cache)
        if (!cache[key]) {
            cache[key] = fn(...args);
        }
        return cache[key];
    }
}

function add(a,b) {
    console.log('此时未缓存')
    return a + b;
}
let add_m = memorize(add);
console.log(add_m(1,2))
console.log(add_m(1,2))
console.log(add_m(3,4))
